说明:
Array、Sets、Dictionary
(Swift将这3中类型使纤维范型集合)
集合类型 | 说明 |
---|---|
数组(Array) | 有序数据集合 |
集合(Sets) | 无序无重复数据的集 |
字典(Dictionaries) | 无序的键值对的值 |
4.1 集合的可变性
说明:集合的可变性依赖于声明为常量或变量。
声明 | 可变性 |
---|---|
常量(let ) |
大小不可改变 |
变量(var ) |
可以添加或移除集合中的项 |
技巧:不可变的集合性能更好。
4.2 数组
扩展:Swift中的
Array
可以桥接到Foundation中的NSArray
。
4.2.1 创建数组
说明:有3种声明数组的形式
形式 | 说明 | 备注 |
---|---|---|
Array<ElementType>(count: Int, repeatedValue) |
调用数组的构造器 |
如果不提供参数,则会调用另一个构造器(创建空数组) |
|[ElementType](count: Int, repeatedValue)
|调用构造器
的方式|另一种调用构造器的方式,和上面等价,更常用|
|[Element, ...]
|数组字面量|[]
表示空数组|
1 | // 声明数组:形式一(构造器,不常用) |
4.2.2 空数组
说明:3种方式(对应数组声明的3种方式)
Array[ElementType]()
[ElementType] ()
[]
(空数组字面量无法推断类型,声明常量或变量时需指定类型)
1 | // 空数组 |
4.2.3 数组相加
说明:
+
、+=
在数组之间起到拼接的作用。
1 | let threeDoubles = [Double](count:3, repeatedValue: 0)// [0.0, 0.0, 0.0] |
4.2.4 数组字面量
语法:一系列由
,
分割并由[]
包含的数值。
- 只能拥有相同类型值
- 当数组不为
[]
的时候,不必把数组的类型定义清楚
1 | var shoppingList = ["Eggs", "Milk"] |
4.2.5 属性和方法(访问和修改数组)
下标
说明:
arr[下标或下标区间]
- 可以通过
下标
(下标区间
)改变某个(些)已有索引值对应的数据项(下标
或下标区间
不能超过数组的下标范围)下标区间
中下标
的数量可以和用来替换其对应的数据项的新数据项数量不同
1 | var shoppingList = ["Eggs", "Milk", "Maple Syrup", "Flour"]// 0...3 |
count属性
类型:
Int
说明:只读属性,用来获取数组中的数据项数量。
1 | var shoppingList = ["Eggs", "Milk"] |
isEmpty属性
类型:
Bool
说明:用来判断数组是否为空。
技巧:可以作为检查count
属性的值是否为0的捷径。
1 | // 字面量 |
append方法
说明:在数组后面添加新的数据项。
原型:String类型的实例方法
1 | >/** |
1 | var shoppingList = ["Eggs", "Milk"] |
insert方法
说明:在某个具体索引项之前添加数据项。
原型:String类型的实例方法
1 | >/** |
1 | shoppingList.insert("Flour", atIndex: 0) |
removeAtIndex方法
说明:移除数组中的某一项。
原型:String类型的实例方法
1 | >/** |
1 | var shoppingList = ["Eggs", "Milk", "Maple Syrup"] |
removeFirst函数
说明:删除第一项
原型:String类型的实例方法
1 | >/** |
1 | var shoppingList = ["Eggs", "Milk", "Maple Syrup"] |
removeLast函数
说明:删除最后一项
原型:String类型的实例方法
1 | >/** |
1 | var shoppingList = ["Eggs", "Milk", "Maple Syrup"] |
4.2.6 数组遍历
说明:有两种方式
for-in
:只在遍历时获得元素项for-in
配合enumerate
:遍历时获得元素项和对应下标
enumerate方法
说明:配合
for-in
使用,返回一个由每一个数据项索引和数据值组成的元组。
1 | // for-in |
4.3 集合
关键字:
Set
- 元素类型相同
- 没有确定顺序
- 每个元素只出现一次
扩展:Swift中的
Set
类型被桥接到Foundation
中的NSSet
类。
4.3.1 集合类型的哈希值
说明:存储在
Set
中的类型必须是可哈希化
的。
值类型(可哈细化) | 条件 | 备注 |
---|---|---|
String 、Int 、Double 、Bool |
无 | 所有基本类型(既可以作为值,也可以作为键) |
enum 类型值 |
没有关联值 | |
自定义类型 | 实现Hashable 协议(符合Equatable 协议) |
1. 需要提供一个类型为Int 的可读属性hashValue ;2. 提供一个是否相等运算符== 的实现 |
注意:Hashable协议的
==
实现必须满足三种情况
- 自反性:
a == a
- 对称性:
a == b
意味着b == a
- 传递性:
a == b
&&b == c
意味着a == c
4.3.2 声明集合类型
说明:有2种类型
形式 | 说明 | 备注 |
---|---|---|
Set<ElementType>() |
调用构造器 | 没有类似[ElementType] () 的简化形式 |
Set() |
调用构造器 | 必要条件是声明的变量或常量不仅制定了Set ,而且明确了<ElementType> |
[Element, ...] |
字面量 | 需要明确指定标记名:Set<ElementType> ,其中<ElementType> 在集合字面量不是[] 的情况下可以省略(类型推断) |
1 | // 创建空Set(形式1) |
4.3.3 创建和构造一个空的集合
说明:2种形式(对应两种声明方式)
Set<ElementType>()
Set()
[]
(无法进行类型推断,需要指定ElementType
)
1 | // 形式1 |
4.3.4 用数组字面量创建集合
注意:对应的常量或变量必须指定了
Set
类型,否则会被默认为Array
。
4.3.5 属性和方法(访问和修改一个集合)
count属性
类型:
Int
说明:只读属性,用来获取Set
中的数据项数量。
isEmpty属性
类型:
Bool
说明:用来判断数组是否为空。
技巧:可以作为检查count
属性的值是否为0的捷径。
insert方法
说明:在
Set
中插入一个元素。
原型:Set类型的实例方法
1 | >/** |
remove方法
说明:移除一个数据项
原型:Set类型的实例方法
1 | >/** |
contain方法
说明:检查
Set
中是否包含一个特定的值。
原型:Set类型的实例方法
1 | >/** |
1 | // 创建空Set(形式1) |
4.3.6 遍历一个集合
说明:如果不做任何处理,使用
for-in
遍历时Set
时并没有确定的顺序。
sort方法
说明:根据提供的序列返回一个有序
Set
。
原型:Set类型的实例方法
1 | >/** |
1 | var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"] |
4.3.7 完成集合操作
4.3.7.1 基本集合操作
说明:交、差、并、补
集合操作 | 方法 |
---|---|
交 | intersect |
差 | exclusive |
并 | union |
补 | subtract |
1 | // 奇数 |
4.3.7.2 集合成员关系和相等
说明:集合之间的关系可以分为6中情况
关系 | 判定方式 | 说明 |
---|---|---|
相等 | == |
判断两个集合是否包含全部相同的值 |
被包含 | isSubsetOf |
判断一个集合中的值是否也被包含在另外一个集合中 |
包含 | isSupersetOf |
判断一个集合中包含另一个集合的所有值 |
被包含且不想等 | isStrucxtSubsetOf |
判定一个集合是另外一个集合的真子集 |
包含且不想等 | isStructSupersetOf |
判定一个集合是另外一个集合的父集且不想等 |
不相交 | isDisjoinWith |
判断两个集合不包含相同的值 |
1 | let houseAnimals: Set = ["dog", "cat"] |
4.4 字典
类型关键字:
Dictionary
说明:其实就是键值对容器。
- 每个
value
都关联唯一的key
key
作为字典中的这个值数据的标示符- 没有具体顺序
限制:对
key
和value
的类型要求有所不同
key
:其类型必须遵循Hashable
协议value
:所有数据类型扩展:Swift中的
Dictionary
4.4.1 创建字典
说明:可划分为
3
种方式
创建形式 | 说明 | 是否只能创建空字典 | 备注 |
---|---|---|---|
[keyType: valueType] () |
调用构造器的简化形式 | 是 | |
[key1: value1, ...] |
字面量 | 否,空字典字面量为[:] |
|
Dictionary<Int, String>() |
调用构造器 | 是 | <Int, String> 可省略(当变量或常量的键值对类型已指定过时) |
1 | // 方式1:构造器的简化方式 |
4.4.2 访问和修改字典
下标
说明:通过下标可以实现字典中
key-value
的增删改查。
注意:当通过下标使用key
访问字典中的value
时,返回的是相应的可选型。
1 | var airports: [String: String] = ["YYZ": "Toronto", "DUB": "Dublin"] |
count属性
类型说明:
Int
说明:记录着字典中着键值对的数量的只读属性。
isEmpty属性
类型说明:
Bool
说明:判断字典是否为空字典。
keys属性
类型:
[key1, key2, ...]
说明:字典中所有数据项的key
构成的数组。
values属性
类型:
[value1, value2, ...]
说明:字典中所有数据项的value
构成的数组。
removeValueForKey方法
说明:通过
key
移除键值对。
原型:Dictionary类型的实例方法
1 | >/** |
1 | // count |
4.4.3 字典遍历
说明:通过
for-in
便利字典时,每一个数据项都以(key, value)
元组形式返回。
技巧:
- 可以通过临时常量或变量分解
(key, value)
- 可以使用
keys
或values
属性获取相应的数组单独进行遍历- 字典是无序的,可以通过对
keys
或values
属性使用sort方法
获得特定顺序
1 | // 遍历字典 |